
package Procesos;

import java.util.ArrayList;
import negocio.EntidadXML;
import negocio.EtiquetaXML;

/**
 * Esta clase contiene los metodos que son invocados para realizar las distintas operaciones
 * del ParserXML
 * @author Emiliano
 */
public class GestorEntidad {
    
    public static ArrayList<EntidadXML> listaEntidades;
    
    /**
     * Metodo utilizado para armar y ordenar las etiquetas del xml en una estructura
     * de Entidades.
     */
    
    public static void armarEntidades(ArrayList<EtiquetaXML> conjuntoEtiquetas) {
        listaEntidades = new ArrayList<EntidadXML>();

        /* Recorremos conjuntoEtiquetas y por cada par de etiquetas se debe
         * crear la EntidadXML asociada
         */
        for (int i=0 ; i<conjuntoEtiquetas.size() ; i++) {
            EtiquetaXML etiqueta = conjuntoEtiquetas.get(i);

            if (etiqueta.isRaiz()) {
            	/* En el caso que la etiqueta sea una raiz, se debe indicar que la 
            	 * EntidadXML asociada es una raiz
            	 */
                EntidadXML entidadRaiz = new EntidadXML();
                entidadRaiz.setEsRaiz(true);
                entidadRaiz.setEtiqueta(etiqueta);
                entidadRaiz.setContenido(etiqueta.getContenidoEtiqueta());
                entidadRaiz.setNombre(etiqueta.getApertura());
                entidadRaiz.setAtributos(etiqueta.getAtributos());
                listaEntidades.add(entidadRaiz);
            } else {
            	/* En el caso que la etiqueta no sea una raiz, se debe crear una entidad
            	 * y recorrer la lista de Entidades que se va creando para asociar 
            	 * la entidad padre.
            	 */
            	for (int j=0 ; j<listaEntidades.size() ; j++) {
                    EntidadXML entidad = listaEntidades.get(j);

                    if (etiqueta.getEtiquetaPadre().equals(entidad.getEtiqueta())) {
                        EntidadXML hijo = new EntidadXML();
                        hijo.setContenido(etiqueta.getContenidoEtiqueta());
                        hijo.setEntidadPadre(entidad);
                        hijo.setEsRaiz(false);
                        hijo.setNombre(etiqueta.getApertura());
                        hijo.setEtiqueta(etiqueta);
                        hijo.setAtributos(etiqueta.getAtributos());

                        entidad.getHijos().add(hijo);
                        listaEntidades.add(hijo);
                        break;
                    }
                }
            }
        }
    }

    /**
     * Metodo utilizado para obtener la raiz de listaEntidades
     * @return EntidadXML - la raiz de listaEntidades
     */
    public static EntidadXML obtenerRaiz() {
    	EntidadXML raiz = null;
    	if (listaEntidades != null && !listaEntidades.isEmpty()) {
    		for (int i=0 ; i<listaEntidades.size() ; i++) {
        		EntidadXML entidad = listaEntidades.get(i);
        		if (entidad != null) {
        			if (entidad.isEsRaiz()) {
        				raiz = entidad;
        				break;
        			}
        		}
        	}
    	}
    	return raiz;
    }
}
